package com.atguigu.redis7.utils;

import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;

/**
 * @auther zzyy
 * @create 2022-12-27 14:56
 */
@Component
@Slf4j
public class CheckUtils
{
    @Resource
    private RedisTemplate redisTemplate;
    
    /**
     * 使用布隆过滤器检查特定元素是否可能存在于集合中。
     * 布隆过滤器是一种空间有效的数据结构，用于检查一个元素是否属于一个集合。
     * 它可能会误报（false positive），但不会误漏（false negative）。
     *
     * @param checkItem 布隆过滤器的键名，用于在Redis中查找过滤器。
     * @param key 待检查的元素，其哈希值将用于定位过滤器中的位。
     * @return 如果元素可能存在于集合中，则返回true；否则返回false。
     */
    public boolean checkWithBloomFilter(String checkItem,String key)
    {
        // 计算key的哈希值，用于在布隆过滤器中定位位索引。
        int hashValue = Math.abs(key.hashCode());
        // 将哈希值转换为长整型，并对其取模，以适应过滤器的大小。
        long index = (long)(hashValue % Math.pow(2,32));
        // 从Redis中的布隆过滤器检查特定索引位是否为1，这表示元素可能存在。
        boolean existOK = redisTemplate.opsForValue().getBit(checkItem,index);
        // log.info("--->key:"+key+" 对应坑位下标index: "+index+" 是否存在："+existOK);
        
        return existOK;
    }
    
}
